<?php
/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Db
 * @subpackage Profiler
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: Query.php 23775 2011-03-01 17:25:24Z ralph $
 */

/**
 * @category   Zend
 * @package    Zend_Db
 * @subpackage Profiler
 * @copyright  Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Db_Profiler_Query {
	
	/**
	 * SQL query string or user comment, set by $query argument in constructor.
	 *
	 * @var string
	 */
	protected $_query = '';
	
	/**
	 * One of the Zend_Db_Profiler constants for query type, set by $queryType argument in constructor.
	 *
	 * @var integer
	 */
	protected $_queryType = 0;
	
	/**
	 * Unix timestamp with microseconds when instantiated.
	 *
	 * @var float
	 */
	protected $_startedMicrotime = null;
	
	/**
	 * Unix timestamp with microseconds when self::queryEnd() was called.
	 *
	 * @var integer
	 */
	protected $_endedMicrotime = null;
	
	/**
	 * @var array
	 */
	protected $_boundParams = array ();
	
	/**
	 * @var array
	 */
	
	/**
	 * Class constructor.  A query is about to be started, save the query text ($query) and its
	 * type (one of the Zend_Db_Profiler::* constants).
	 *
	 * @param  string  $query
	 * @param  integer $queryType
	 * @return void
	 */
	public function __construct($query, $queryType) {
		$this->_query = $query;
		$this->_queryType = $queryType;
		// by default, and for backward-compatibility, start the click ticking
		$this->start ();
	}
	
	/**
	 * Clone handler for the query object.
	 * @return void
	 */
	public function __clone() {
		$this->_boundParams = array ();
		$this->_endedMicrotime = null;
		$this->start ();
	}
	
	/**
	 * Starts the elapsed time click ticking.
	 * This can be called subsequent to object creation,
	 * to restart the clock.  For instance, this is useful
	 * right before executing a prepared query.
	 *
	 * @return void
	 */
	public function start() {
		$this->_startedMicrotime = microtime ( true );
	}
	
	/**
	 * Ends the query and records the time so that the elapsed time can be determined later.
	 *
	 * @return void
	 */
	public function end() {
		$this->_endedMicrotime = microtime ( true );
	}
	
	/**
	 * Returns true if and only if the query has ended.
	 *
	 * @return boolean
	 */
	public function hasEnded() {
		return $this->_endedMicrotime !== null;
	}
	
	/**
	 * Get the original SQL text of the query.
	 *
	 * @return string
	 */
	public function getQuery() {
		return $this->_query;
	}
	
	/**
	 * Get the type of this query (one of the Zend_Db_Profiler::* constants)
	 *
	 * @return integer
	 */
	public function getQueryType() {
		return $this->_queryType;
	}
	
	/**
	 * @param string $param
	 * @param mixed $variable
	 * @return void
	 */
	public function bindParam($param, $variable) {
		$this->_boundParams [$param] = $variable;
	}
	
	/**
	 * @param array $param
	 * @return void
	 */
	public function bindParams(array $params) {
		if (array_key_exists ( 0, $params )) {
			array_unshift ( $params, null );
			unset ( $params [0] );
		}
		foreach ( $params as $param => $value ) {
			$this->bindParam ( $param, $value );
		}
	}
	
	/**
	 * @return array
	 */
	public function getQueryParams() {
		return $this->_boundParams;
	}
	
	/**
	 * Get the elapsed time (in seconds) that the query ran.
	 * If the query has not yet ended, false is returned.
	 *
	 * @return float|false
	 */
	public function getElapsedSecs() {
		if (null === $this->_endedMicrotime) {
			return false;
		}
		
		return $this->_endedMicrotime - $this->_startedMicrotime;
	}
	
	/**
	 * Get the time (in seconds) when the profiler started running.
	 *
	 * @return bool|float
	 */
	public function getStartedMicrotime() {
		if (null === $this->_startedMicrotime) {
			return false;
		}
		
		return $this->_startedMicrotime;
	}
}

